package net.servir.capacidades.web.controller;

import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import javax.sql.DataSource;

import net.servir.capacidades.dao.JdbcExportarExcelDAO;
import net.servir.capacidades.model.Etapa;
import net.servir.capacidades.model.FuncionLeyenda;

import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;

public class ExportarExcelServlet extends HttpServlet {

	  /**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	protected void processRequest(HttpServletRequest request,
	            HttpServletResponse response)
	            throws ServletException, IOException {
		  
		  	//String sSQL = request.getParameter("query");
		  	String sSQLEjecutar = "";
		  			  	
		  	//String sHeaders = request.getParameter("headers");
		  	
	        WebApplicationContext springContext =
	            WebApplicationContextUtils.getWebApplicationContext(getServletContext());
	        
	        DataSource ds1 = (DataSource)springContext.getBean("dataSource");
	        JdbcExportarExcelDAO jdbcExportExcelDAO = new JdbcExportarExcelDAO(ds1);
	        
	        List<Etapa> etapas = jdbcExportExcelDAO.ObtenerFuncionesOrdenadas(15);
	        
		  	response.setContentType("application/vnd.ms-excel");
	        HSSFWorkbook wb = new HSSFWorkbook();       // crea libro
	        HSSFSheet sheet = wb.createSheet("Datos");  // crea hoja
	        HttpSession sesion = request.getSession();
	        String key = "SC"; 
	        Integer idAmbito = 15;
	        String queryFunciones = "";
	        if (request.getParameter("idAmbito") != null && !request.getParameter("idAmbito").equals("") && !request.getParameter("idAmbito").equals("0"))
	        	idAmbito = Integer.parseInt(request.getParameter("idAmbito"));
	        
	        if (request.getParameter("key") != null && !request.getParameter("key").equals(""))
				key = request.getParameter("key");
	        
	        StringBuilder vsql = new StringBuilder(); 
        	sSQLEjecutar = sesion.getAttribute("QUERY").toString();

        	//idAmbito=15; //SIEMPRE SERA AMBITO 15 SNIP2013 
        	
        	if (idAmbito > 0 )
        		queryFunciones = jdbcExportExcelDAO.queryFunciones(idAmbito, key);
	        	        
	        if (key.equals("SC"))
	        {
	        	vsql.append(" SELECT censado.NIVEL_GOBIERNO,censado.ENTIDAD,censado.REGIMENEJECUTORA,censado.SECTOR,censado.PLIEGO,censado.UBIGEO_GEOGRAFICO,censado.UBIGEO_ENTIDAD, ");
	        	vsql.append(" censado.DEPARTAMENTO,censado.PROVINCIA,censado.DISTRITO,censado.ID_PERSONA,censado.DNI,censado.APELLIDO_PATERNO,censado.APELLIDO_MATERNO,censado.NOMBRES,censado.CORREO,censado.CORREO_ALTERNO,censado.ESTUDIOS,censado.TITULO_UNIVERSITARIO,censado.GRADO_ACADEMICO,censado.EXPERIENCIA_SNIP EXPERIENCIA_SA,censado.SEXO, ");
	        	vsql.append(" censado.FECHA_NACIMIENTO,censado.EDAD,censado.REGIMEN,censado.PROFESION," );
	        	vsql.append(" censado.ESTADO,censado.PERFIL,censado.RESPONSABLE, censado.SISTEMA, censado.estado_equipo, ");
	        	vsql.append(" censado.OTROSESTUDIOS,censado.UNIVERSIDAD," );
	        	vsql.append(" CENSADO.EXPERIENCIA_MATERIA," );
	        	vsql.append(" CENSADO.SISTEMA_ADMINISTRATIVO " );
	        	/*
	        	vsql.append(" max(case when f.id_funcion = 11 then '1' else ''  end) as F1 , ");
	        	vsql.append(" max(case when f.id_funcion = 12 then '1' else ''  end) as F2 , max(case when f.id_funcion = 13 then '1' else ''  end) as F3 , "); 
	        	vsql.append(" max(case when f.id_funcion = 14 then '1' else ''  end) as F4 , max(case when f.id_funcion = 15 then '1' else ''  end) as F5 , ");
	        	vsql.append(" max(case when f.id_funcion = 16 then '1' else ''  end) as F6 , max(case when f.id_funcion = 17 then '1' else ''  end) as F7 ");
	        	vsql.append(" FROM servicio_civil_ambito sca join servicio_civil sc on sca.id_servicio_civil = sc.id_servicio_civil ");
	        	vsql.append(" join ejecutora ent on sc.id_ejecutora = ent.id_ejecutora join persona p on sc.dni = p.dni ");
	        	vsql.append(" and sc.id_persona = p.id_persona ");
	        	vsql.append(" left join (select distinct f.id_funcion, sca.id_servicio_civil from etapa e "); 
	        	vsql.append("           join funcion f on e.id_etapa = f.id_etapa join actividad a on f.id_funcion = a.id_funcion ");
	        	vsql.append("           join servicio_civil_actividad sca on a.id_actividad = sca.id_actividad where 1 = 1 ) "); //e.id_ambito = 2 
	        	vsql.append(" f on sc.id_servicio_civil = f.id_servicio_civil ");
	        	*/
	        	if (idAmbito > 0 )
	        	{
		        	vsql.append(queryFunciones);
		        	vsql.append(" join ");
	        	}
	        	else
	        	{
	        		// Nada por hacer
	        	}
	        	vsql.append(" (");
	        	vsql.append(" select sc.id_servicio_civil, sc.estado_equipo, ng.descripcion as nivel_gobierno, nvl(ej.descripcion,'SIN EJECUTORA') as ENTIDAD, sec.descripcion as sector, pli.descripcion as pliego,");
	        	vsql.append(" ej.ubigeo as UBIGEO_GEOGRAFICO, nvl(rej.regimen, 'SIN REGIMEN') as REGIMENEJECUTORA, ej.ubigeo_rpt as UBIGEO_ENTIDAD, ");
	        	vsql.append(" (select descripcion from ubigeo where coddep = SUBSTR(ej.ubigeo,1,2) and codpro = '00' and coddis = '00') as departamento,");
	        	vsql.append(" (select descripcion from ubigeo where coddep = SUBSTR(ej.ubigeo,1,2) and codpro = SUBSTR(ej.ubigeo,3,2) and coddis = '00') as provincia,");
	        	vsql.append(" (select descripcion from ubigeo where coddep = SUBSTR(ej.ubigeo,1,2) and codpro = SUBSTR(ej.ubigeo,3,2) and coddis = SUBSTR(ej.ubigeo,5,2)) as distrito,");
	        	vsql.append(" per.id_persona, per.dni, per.apellido_paterno, per.apellido_materno, per.nombres, sc.correo,");
	        	vsql.append(" sc.correo_alterno, (select descripcion from codigo where grupo='ESTU' and codigo=sc.cod_estudios) as ESTUDIOS,(select descripcion from codigo where grupo='GRAD' and codigo=sc.cod_grado_academico) as GRADO_ACADEMICO,(select descripcion from codigo where codigo=sc.cod_experiencia_snip) as  EXPERIENCIA_SNIP,sc.titulo_universitario,");
	        	vsql.append(" per.sexo, nvl(to_char(per.fec_nacimiento,'DD/MM/YYYY'),'--') as fecha_nacimiento,");
	        	vsql.append(" nvl((SELECT  to_number(to_char(sysdate,'YYYY')) - to_number(to_char(per.fec_nacimiento,'YYYY'))");
	        	vsql.append(" - case when to_char(sysdate,'MMDD') < to_char(per.fec_nacimiento,'MMDD') then 1  else 0  end  as edad ");
	        	vsql.append(" from dual),0) as edad, nvl(reg.descripcion, '--') as regimen, nvl(prof.descripcion, '--') as profesion, nvl(estadoSC.descripcion, '--') as estado, "); 
	        	vsql.append(" pu.puesto_tipo as perfil,");
	        	vsql.append(" nvl(nvl((select  prs.apellido_paterno || ' ' || prs.apellido_materno || ' ' || prs.nombres || '(' || prs.dni || ')' as nombres  ");
	        	vsql.append(" from responsable res ");
	        	vsql.append(" join persona prs on res.id_persona = prs.id_persona and res.dni = prs.dni "); 
	        	vsql.append(" join responsable_ejecutora_ambito rea on rea.id_responsable = res.id_responsable "); 
	        	vsql.append(" where rea.estado = '1' and res.id_responsable = sc.id_responsable), ");
	        	vsql.append(" (select prs.apellido_paterno || ' ' || prs.apellido_materno || ' ' || prs.nombres as nombres ");
	        	vsql.append(" from responsable res ");
	        	vsql.append(" join persona prs on res.id_persona = prs.id_persona and res.dni = prs.dni "); 
	        	vsql.append(" join responsable_ejecutora_ambito rea on rea.id_responsable = res.id_responsable "); 
	        	vsql.append(" where res.id_responsable = sc.id_responsable and ROWNUM <= 1) ");
	        	vsql.append(" ),'--') as responsable, sis.acronimo as sistema, ");
	        	
	        	vsql.append(" SC.OTROSESTUDIOS,SC.UNIVERSIDAD ");
	        	vsql.append(" ,(SELECT cod.descripcion from codigo cod where cod.CODIGO=SC.COD_EXPERIENCIA_MATERIA and cod.GRUPO='ADES') EXPERIENCIA_MATERIA ");
	        	
	        	vsql.append(" ,CASE WHEN (SELECT DNI FROM CENSO.RESPONSABLE RESPON WHERE RESPON.ID_RESPONSABLE = SC.ID_RESPONSABLE) = SC.DNI THEN ");
	        	vsql.append(" (SELECT DES_SE_RESPONSABLE FROM CENSO.SISTEMA_ETAPA SE WHERE SE.ID_SISTEMA_ETAPA = SC.ID_SISTEMA_ETAPA) ELSE (SELECT DES_SISTEMA_ETAPA FROM CENSO.SISTEMA_ETAPA SE WHERE SE.ID_SISTEMA_ETAPA = SC.ID_SISTEMA_ETAPA) ");
	        	vsql.append(" END    SISTEMA_ADMINISTRATIVO ");
                
	        	//vsql.append(" ,(SELECT DES_SISTEMA_ETAPA FROM CENSO.SISTEMA_ETAPA SE WHERE SE.ID_SISTEMA_ETAPA = SC.ID_SISTEMA_ETAPA ) SISTEMA_ADMINISTRATIVO ");
	        	
	        	
	        	vsql.append(" from servicio_civil sc join servicio_civil_ambito sca on sc.id_servicio_civil = sca.id_servicio_civil ");
	        	vsql.append(" join ambito am on am.id_ambito = sca.id_ambito join sistema sis on sis.id_sistema = am.id_sistema ");
	        	vsql.append(" join persona per on per.dni = sc.dni and per.id_persona = sc.id_persona "); // left join censo.REGIMEN_EJECUTORA rej on rej.cod_regimen = ej.cod_regimen
	        	vsql.append(" left join ejecutora ej on ej.id_ejecutora = sc.id_ejecutora ");
	        	vsql.append(" left join censo.REGIMEN_EJECUTORA rej on rej.cod_regimen = ej.cod_regimen ");
	        	vsql.append(" join nivel_gobierno ng on ej.id_nivel_gobierno = ng.id_nivel_gobierno ");
	        	vsql.append(" left join pliego pli on pli.id_pliego = ej.id_pliego left join sector sec on sec.id_sector = pli.id_sector ");
	        	vsql.append(" left join codigo reg on SC.COD_REGIMEN = reg.CODIGO and reg.grupo  = 'REGI' ");
	        	vsql.append(" left join codigo prof on SC.COD_PROFESION = prof.CODIGO and prof.grupo  = 'PROF' ");
	        	vsql.append(" left join codigo estadoSC on SC.COD_ESTADO = estadoSC.CODIGO and estadoSC.grupo  = 'EOPE' ");
	        	vsql.append(" left join puesto_tipo pu on pu.id_puesto_tipo = sc.id_puesto_tipo ");
	        	vsql.append(" ) censado ");
	        	if (idAmbito > 0 )
	        	{
	        		vsql.append("on censado.id_servicio_civil = sc.id_servicio_civil");
	        	}
	        	vsql.append(" WHERE 1 = 1  "); //sca.id_ambito = 2    AGREGAMOS SISTEMA 10 SOLO SNIP2013
	        	vsql.append(" and censado.id_servicio_civil in (select sqlEjecutar.id_servicio_civil from (");
	        	vsql.append(sSQLEjecutar);
	        	vsql.append(") sqlEjecutar ) ");
	        	vsql.append(" GROUP BY censado.NIVEL_GOBIERNO,censado.ENTIDAD,censado.REGIMENEJECUTORA,censado.SECTOR,censado.PLIEGO,censado.UBIGEO_GEOGRAFICO,censado.UBIGEO_ENTIDAD, ");
	        	vsql.append(" censado.DEPARTAMENTO,censado.PROVINCIA,censado.DISTRITO,censado.ID_PERSONA,censado.DNI,censado.APELLIDO_PATERNO,censado.APELLIDO_MATERNO,censado.NOMBRES,censado.CORREO,censado.CORREO_ALTERNO,censado.ESTUDIOS,censado.TITULO_UNIVERSITARIO,censado.GRADO_ACADEMICO,censado.EXPERIENCIA_SNIP,censado.SEXO, ");
	        	vsql.append(" censado.FECHA_NACIMIENTO,censado.EDAD,censado.REGIMEN,censado.PROFESION,");
	        	vsql.append(" censado.ESTADO,censado.PERFIL,censado.RESPONSABLE, censado.SISTEMA, censado.estado_equipo, ");
	        	vsql.append(" CENSADO.OTROSESTUDIOS,CENSADO.UNIVERSIDAD, ");
	        	vsql.append(" CENSADO.EXPERIENCIA_MATERIA, ");
	        	vsql.append(" CENSADO.SISTEMA_ADMINISTRATIVO ");
	        	/* @26022013 INICIO Arson
	        	 * Se añade código para agrupar el query generado la funcion queryFunciones
	        	 */
//	        	System.out.println("idAmbito : "+idAmbito);
	        	if (idAmbito > 0 )
	        		vsql.append(",sc.id_servicio_civil");
	        	/* @26022013 FIN Arson
	        	 * Se añade código para agrupar el query generado la funcion queryFunciones
	        	 */
	        	
	        	vsql.append(" ORDER BY 2,12 ");
	        }
	        	
	        if (key.equals("RES"))
	        {
	        	vsql.append(" SELECT censado.NIVEL_GOBIERNO,censado.ID_ENTIDAD,censado.ENTIDAD,censado.REGIMENEJECUTORA,censado.SECTOR,censado.PLIEGO,censado.UBIGEO_GEOGRAFICO,censado.UBIGEO_ENTIDAD, ");
	        	vsql.append(" censado.DEPARTAMENTO,censado.PROVINCIA,censado.DISTRITO,censado.ID_PERSONA,censado.DNI,censado.APELLIDO_PATERNO,censado.APELLIDO_MATERNO,censado.NOMBRES,censado.CORREO,censado.SEXO, ");
	        	vsql.append(" censado.FECHA_NACIMIENTO,censado.EDAD,censado.REGIMEN,censado.PROFESION, ");
	        	vsql.append(" censado.ENT_DIRECCION, censado.NOMBRE_PUESTO, censado.ESTADO_PUESTO,");
	        	//vsql.append(" TELEFONO, NRO_ANEXO, NRO_FAX, NRO_CELULAR, RPM_RPC, COMENTARIO, ");	//
	        	vsql.append(" censado.TELEFONO, censado.NRO_ANEXO, censado.NRO_FAX, censado.NRO_CELULAR, censado.RPM_RPC, censado.COMENTARIO, FEC_HABILITACION_SC, PLAZO_SC, FEC_CIERRE_SC, ");	//ahora 12-03-2013
	        	vsql.append(" censado.ESTADO,censado.PERFIL,censado.RESPONSABLE,censado.SISTEMA,");
	        	//Se agregan los nuevos campos
	        	vsql.append("censado.GRADO_ACADEMICO,censado.EXPERIENCIA_SNIP EXPERIENCIA_SA,censado.ESTUDIOS,censado.TITULO_UNIVERSITARIO,censado.CORREO_ALTERNO,");
	        	//vsql.append("censado.FUNCION_PERSONALIZADA,");
	        	//NUEVOS CAMPOS ARSON 2014
	        	vsql.append(" censado.OTROSESTUDIOS,censado.UNIVERSIDAD");
	        	vsql.append(" ,censado.EXPERIENCIA_MATERIA,censado.SISTEMA_ADMINISTRATIVO, CENSADO.FUNCIONES_TERCERIZADAS");
	        	/*
	        	for(Etapa etapa: etapas){
	        		for(FuncionLeyenda funcion : etapa.getFunciones()){
	        			vsql.append(",censado."+funcion.getNemotecnico());
	        		}
	        	}*/
	        	/*vsql.append("censado.F03,censado.F05,censado.F08,censado.F09,censado.F10,censado.F11,censado.F12,censado.F14,censado.F15,censado.F16,");
	        	vsql.append("censado.F17,censado.F18,censado.F19,censado.F20,censado.F21,censado.F22,censado.F23,censado.P06,censado.P09,censado.P14," +
	        			"censado.P17,censado.P19,censado.P21,censado.P22,censado.P23,censado.P24,censado.P25,censado.P26,censado.P27,censado.P28," +
	        			"censado.P31,censado.P32,censado.P33,censado.P34,censado.P36,censado.P38,censado.P39,censado.P40,censado.P41,censado.P44," +
	        			"censado.P45,censado.P46,censado.P47,censado.P48,censado.P49,censado.P51,censado.P54,censado.P55,censado.P99");*/
	        	/*
	        	vsql.append(" max(case when f.id_funcion = 11 then '1' else ''  end) as F1 , ");
	        	vsql.append(" max(case when f.id_funcion = 12 then '1' else ''  end) as F2 , max(case when f.id_funcion = 13 then '1' else ''  end) as F3 ,"); 
	        	vsql.append(" max(case when f.id_funcion = 14 then '1' else ''  end) as F4 , max(case when f.id_funcion = 15 then '1' else ''  end) as F5 , ");
	        	vsql.append(" max(case when f.id_funcion = 16 then '1' else ''  end) as F6 , max(case when f.id_funcion = 17 then '1' else ''  end) as F7 ");
	        	*/
	        	
	        	if (idAmbito > 0 )
	        	{
		        	vsql.append(queryFunciones);
	        	}
	        	else
	        	{
		        	vsql.append(" ");
	        	}
	        	
	        	vsql.append(" FROM ");
	        	vsql.append(" (");
	        	vsql.append(" select rea.id_ambito, rea.id_ejecutora, sc.id_servicio_civil, res.id_responsable, ng.descripcion as nivel_gobierno, ej.id_ejecutora as ID_ENTIDAD , ej.descripcion as ENTIDAD, sec.descripcion as sector, pli.descripcion as pliego,");
	        	vsql.append(" ej.ubigeo as UBIGEO_GEOGRAFICO, nvl(rej.regimen, 'SIN REGIMEN') as REGIMENEJECUTORA, ej.ubigeo_rpt as UBIGEO_ENTIDAD, ");
	        	vsql.append(" ej.direccion as ENT_DIRECCION, res.nombrepuesto as NOMBRE_PUESTO,res.estadoenpuesto as ESTADO_PUESTO, ");	
	        	vsql.append(" sc.telefono as TELEFONO, sc.anexo as NRO_ANEXO, sc.fax as NRO_FAX, sc.celular as NRO_CELULAR, sc.rpmrpc as RPM_RPC, sc.comentarios as COMENTARIO, ");
	        	//Se agrego FEC_HABILITACION, PLAZO, FEC_CIERRE
	        	vsql.append(" to_char(rea.FEC_HABILITACION,'DD/MM/YYYY') as FEC_HABILITACION_SC, rea.plazo as PLAZO_SC, to_char(nvl(rea.FEC_CIERRE,rea.fec_habilitacion + rea.plazo),'DD/MM/YYYY') as FEC_CIERRE_SC ,");	
	        	vsql.append(" (select descripcion from ubigeo where coddep = SUBSTR(ej.ubigeo,1,2) and codpro = '00' and coddis = '00') as departamento, ");
	        	vsql.append(" (select descripcion from ubigeo where coddep = SUBSTR(ej.ubigeo,1,2) and codpro = SUBSTR(ej.ubigeo,3,2) and coddis = '00') as provincia, ");
	        	vsql.append(" (select descripcion from ubigeo where coddep = SUBSTR(ej.ubigeo,1,2) and codpro = SUBSTR(ej.ubigeo,3,2) and coddis = SUBSTR(ej.ubigeo,5,2)) as distrito, ");
	        	vsql.append(" per.id_persona, per.dni, per.apellido_paterno,per.apellido_materno,per.nombres, res.correo, ");
	        	vsql.append(" per.sexo, nvl(to_char(per.fec_nacimiento,'DD/MM/YYYY'),'--') as fecha_nacimiento, ");
	        	vsql.append(" nvl((SELECT  to_number(to_char(sysdate,'YYYY')) - to_number(to_char(per.fec_nacimiento,'YYYY')) ");
	        	vsql.append(" - case when to_char(sysdate,'MMDD') < to_char(per.fec_nacimiento,'MMDD') then 1  else 0  end  as edad ");
	        	vsql.append(" from dual),0) as edad, nvl(reg.descripcion, '--') as regimen, nvl(prof.descripcion, '--') as profesion, case when nvl(rea.estado_registro,'0') = '0' then 'REGISTRADO' when rea.estado_registro = '1' then 'HABILITADO' when rea.estado_registro = '2' then 'FINALIZADO' when rea.estado_registro = '3' then 'CERRADO' END as estado, "); 
	        	vsql.append(" 'RESPONSABLE' as perfil, ");
	        	vsql.append(" nvl(nvl((select distinct prs.apellido_paterno || ' ' || prs.apellido_materno || ' ' || prs.nombres || '(' || prs.dni || ')' as nombres ");
	        	vsql.append(" from responsable resp  ");
	        	vsql.append(" join persona prs on resp.id_persona = prs.id_persona and resp.dni = prs.dni "); 
	        	vsql.append(" join responsable_ejecutora_ambito rea on rea.id_responsable = resp.id_responsable "); 
	        	vsql.append(" where rea.estado = '1' and resp.id_responsable = res.id_responsable), ");
	        	vsql.append(" (select prs.apellido_paterno || ' ' || prs.apellido_materno || ' ' || prs.nombres as nombres ");
	        	vsql.append(" from responsable resp "); 
	        	vsql.append(" join persona prs on resp.id_persona = prs.id_persona and resp.dni = prs.dni "); 
	        	vsql.append(" join responsable_ejecutora_ambito rea on rea.id_responsable = resp.id_responsable "); 
	        	vsql.append(" where resp.id_responsable = res.id_responsable and ROWNUM <= 1) ");
	        	vsql.append(" ),'--') as responsable, sis.acronimo as sistema, ");
	        	//Se agregan los nuevos campos:
	        	vsql.append("(SELECT cod.descripcion from codigo cod where cod.codigo=res.grado and cod.GRUPO='GRAD' ) as GRADO_ACADEMICO,");
	        	vsql.append("(SELECT cod.descripcion from codigo cod where cod.descripcion=upper(res.ANIOESTUDIO) and cod.GRUPO='ADES') as EXPERIENCIA_SNIP,");
	        	vsql.append("(SELECT cod.descripcion from codigo cod where cod.codigo=res.ESTUDIOS  and cod.GRUPO='ESTU') as ESTUDIOS,");
	        	vsql.append("res.titulo as TITULO_UNIVERSITARIO,res.EMAILSECUNDARIO as CORREO_ALTERNO");
	        	// NUEVOS CAMPOS ARSON 2014
	        	vsql.append(",res.OTROSESTUDIOS,res.UNIVERSIDAD ");
	        	vsql.append(",(SELECT DES_SE_RESPONSABLE FROM CENSO.SISTEMA_ETAPA SE WHERE SE.ID_SISTEMA_ETAPA = RES.ID_SISTEMA_ETAPA ) SISTEMA_ADMINISTRATIVO ");
	        	vsql.append(",(SELECT cod.descripcion from codigo cod where cod.CODIGO=res.COD_EXPERIENCIA_MATERIA and cod.GRUPO='ADES') EXPERIENCIA_MATERIA ");
	        	vsql.append(", CASE REA.FLG_SERVICE WHEN 1 THEN 'Si' WHEN 0 THEN 'No' ELSE '' END FUNCIONES_TERCERIZADAS" );
	        	/*
	        	for(Etapa etapa:etapas){
	        		for(FuncionLeyenda funcion : etapa.getFunciones()){
	        			vsql.append(",case when nvl(  (select  distinct fun.id_funcion from etapa eta join funcion fun on eta.id_etapa = fun.id_etapa  join actividad act on fun.id_funcion = act.id_funcion join servicio_civil_actividad serv  on act.id_actividad = serv.id_actividad join nivel_gobierno_funcion ngf on ngf.id_funcion = fun.id_funcion where ngf.id_nivel_gobierno = ej.id_nivel_gobierno and  serv.id_servicio_civil = sc.id_servicio_civil and fun.id_funcion = "+funcion.getId_funcion()+"   ) ,0) = 0 then '-' else 'x' end as "+funcion.getNemotecnico()+"  ");
	        		}
	        	}*/
	        	  
	        	vsql.append(" from responsable res ");
	        	vsql.append(" join persona per on per.dni = res.dni and per.id_persona = res.id_persona ");
	        	vsql.append(" join responsable_ejecutora_ambito rea on rea.id_responsable = res.id_responsable ");
	        	vsql.append(" left join ambito am on am.id_ambito = rea.id_ambito join sistema sis on sis.id_sistema = am.id_sistema  ");
	        	vsql.append(" left join servicio_civil sc on sc.dni = per.dni and sc.id_persona = per.id_persona AND SC.ID_RESPONSABLE=RES.ID_RESPONSABLE ");
	        	vsql.append(" left join ejecutora ej on ej.id_ejecutora = rea.id_ejecutora ");
	        	vsql.append(" left join censo.REGIMEN_EJECUTORA rej on rej.cod_regimen = ej.cod_regimen ");
	        	vsql.append(" left join nivel_gobierno ng on ej.id_nivel_gobierno = ng.id_nivel_gobierno ");
	        	vsql.append(" left join pliego pli on pli.id_pliego = ej.id_pliego left join sector sec on sec.id_sector = pli.id_sector ");
	        	vsql.append(" left join codigo reg on res.COD_REGIMEN = reg.CODIGO and reg.grupo  = 'REGI' ");
	        	vsql.append(" left join codigo prof on res.COD_PROFESION = prof.CODIGO and prof.grupo  = 'PROF' ");
	        	vsql.append(" ) censado left join servicio_civil sc on censado.id_servicio_civil = sc.id_servicio_civil  ");
	        	vsql.append(" left join servicio_civil_ambito sca on sca.id_servicio_civil = sc.id_servicio_civil  ");
	        	vsql.append(" left join ejecutora ent on censado.id_ejecutora = ent.id_ejecutora  ");
	        	vsql.append(" left join persona p on sc.dni = p.dni and sc.id_persona = p.id_persona  ");
	        	vsql.append(" left join (select distinct f.id_funcion, sca.id_servicio_civil,ngf.id_nivel_gobierno from etapa e "); 
	        	vsql.append("           join funcion f on e.id_etapa = f.id_etapa join actividad a on f.id_funcion = a.id_funcion ");
	        	vsql.append("           join nivel_gobierno_funcion ngf on  ngf.id_funcion = a.id_funcion join servicio_civil_actividad sca on a.id_actividad = sca.id_actividad where 1 = 1 )  "); // e.id_ambito = 2 
	        	vsql.append(" f on sc.id_servicio_civil = f.id_servicio_civil  ");
	        	vsql.append(" WHERE  1 = 1 "); // censado.id_ambito = 2
	        	vsql.append(" and censado.id_responsable in (select sqlEjecutar.id_responsable from (");
	        	vsql.append(sSQLEjecutar);
	        	vsql.append(") sqlEjecutar ) ");
	        	vsql.append(" GROUP BY censado.NIVEL_GOBIERNO,censado.ID_ENTIDAD,censado.ENTIDAD,censado.REGIMENEJECUTORA,censado.SECTOR,censado.PLIEGO,censado.UBIGEO_GEOGRAFICO,censado.UBIGEO_ENTIDAD, ");
	        	vsql.append(" censado.DEPARTAMENTO,censado.PROVINCIA,censado.DISTRITO,censado.ID_PERSONA,censado.DNI,censado.APELLIDO_PATERNO,censado.APELLIDO_MATERNO,censado.NOMBRES,censado.CORREO,censado.SEXO, ");
	        	vsql.append(" censado.FECHA_NACIMIENTO,censado.EDAD,censado.REGIMEN,censado.PROFESION,");
	        			vsql.append(" censado.ENT_DIRECCION, censado.NOMBRE_PUESTO, censado.ESTADO_PUESTO,");
	        			//vsql.append(" TELEFONO, NRO_ANEXO, NRO_FAX, NRO_CELULAR, RPM_RPC, COMENTARIO,");	
	        			vsql.append(" censado.TELEFONO, censado.NRO_ANEXO, censado.NRO_FAX, censado.NRO_CELULAR, censado.RPM_RPC, censado.COMENTARIO, FEC_HABILITACION_SC, PLAZO_SC, FEC_CIERRE_SC, ");	
	        			vsql.append(" censado.ESTADO,censado.PERFIL,censado.RESPONSABLE, censado.SISTEMA, ");
	        			//Se agregan los nuevos campos:
	        			vsql.append("censado.GRADO_ACADEMICO,censado.EXPERIENCIA_SNIP,censado.ESTUDIOS,censado.TITULO_UNIVERSITARIO,censado.CORREO_ALTERNO,");
	        			//vsql.append(" censado.FUNCION_PERSONALIZADA,");
	        			// NUEVOS CAMPOS ARSON 2014
	        			vsql.append(" censado.OTROSESTUDIOS, censado.UNIVERSIDAD ");
	        			vsql.append(" ,censado.EXPERIENCIA_MATERIA, censado.SISTEMA_ADMINISTRATIVO, CENSADO.FUNCIONES_TERCERIZADAS ");
	        			/*
	        			for(Etapa etapa:etapas){
	    	        		for(FuncionLeyenda funcion : etapa.getFunciones()){
	    	        			vsql.append(",censado."+funcion.getNemotecnico());
	    	        		}
	    	        	}*/
	        			/*vsql.append("censado.F03,censado.F05,censado.F08,censado.F09,censado.F10,censado.F11,censado.F12,censado.F14,censado.F15,censado.F16," +
	        					"censado.F17,censado.F18,censado.F19,censado.F20,censado.F21,censado.F22,censado.F23,censado.P06,censado.P09,censado.P14,");
	        			vsql.append("censado.P17,censado.P19,censado.P21,censado.P22,censado.P23,censado.P24,censado.P25,censado.P26,censado.P27,censado.P28," +
	        					"censado.P31,censado.P32,censado.P33,censado.P34,censado.P36,censado.P38,censado.P39,censado.P40,censado.P41,censado.P44" +
	        					",censado.P45,censado.P46,censado.P47,censado.P48,censado.P49,censado.P51,censado.P54,censado.P55,censado.P99");*/
	        	vsql.append(" ORDER BY 2,12 ");
		        } 
		        
	        System.out.println("Query : "+vsql.toString());
		        jdbcExportExcelDAO.FillExcelSheetWithQuery(vsql.toString(), sheet,wb);
		              
		        OutputStream out = response.getOutputStream();
		        wb.write(out);
		        out.close();
	  }

	  // <editor-fold defaultstate="collapsed" desc="metodos doGet y doPost creados por NetBeans">
	    /**
	     * Handles the HTTP <code>GET</code> method.
	     * @param request servlet request
	     * @param response servlet response
	     * @throws ServletException if a servlet-specific error occurs
	     * @throws IOException if an I/O error occurs
	     */
	    @Override
	    protected void doGet(HttpServletRequest request, HttpServletResponse response)
	            throws ServletException, IOException {
	        processRequest(request, response);
	    }

	    /**
	     * Handles the HTTP <code>POST</code> method.
	     * @param request servlet request
	     * @param response servlet response
	     * @throws ServletException if a servlet-specific error occurs
	     * @throws IOException if an I/O error occurs
	     */
	    @Override
	    protected void doPost(HttpServletRequest request, HttpServletResponse response)
	            throws ServletException, IOException {
	        processRequest(request, response);
	    }

	    /**
	     * Returns a short description of the servlet.
	     * @return a String containing servlet description
	     */
	    @Override
	    public String getServletInfo() {
	        return "Short description";
	    }// </editor-fold>
	}